// #include <stdio.h>
// #include <string.h>
// #include <stdlib.h>
//
// // 简单模式匹配（暴力匹配）
// int simpleMatch(const char* text, const char* pattern) {
//     int textLength = strlen(text);
//     int patternLength = strlen(pattern);
//     for (int i = 0; i <= textLength - patternLength; i++) {
//         int j = 0;
//         while (j < patternLength && text[i + j] == pattern[j]) {
//             j++;
//         }
//         if (j == patternLength) {
//             return i; // 返回模式字符串在主字符串中的起始位置
//         }
//     }
//     return -1; // 如果没有找到匹配的子序列，返回-1
// }
//
// // 计算部分匹配表（next数组）
// void computeNext(const char* pattern, int* next) {
//     int patternLength = strlen(pattern);
//     next[0] = 0; // next数组的初始值
//     int k = 0; // k表示前缀的长度
//     for (int i = 1; i < patternLength; i++) {
//         while (k > 0 && pattern[k] != pattern[i]) {
//             k = next[k - 1];
//         }
//         if (pattern[k] == pattern[i]) {
//             k++;
//         }
//         next[i] = k;
//     }
// }
//
// // KMP匹配算法
// int KMP(const char* text, const char* pattern) {
//     int textLength = strlen(text);
//     int patternLength = strlen(pattern);
//     int next[patternLength];
//     computeNext(pattern, next);
//
//     int i = 0; // 主字符串的索引
//     int j = 0; // 模式字符串的索引
//     while (i < textLength && j < patternLength) {
//         if (j == 0 || text[i] == pattern[j]) {
//             i++;
//             j++;
//         } else {
//             j = next[j - 1];
//         }
//     }
//     if (j == patternLength) {
//         return i - j; // 返回模式字符串在主字符串中的起始位置
//     }
//     return -1; // 如果没有找到匹配的子序列，返回-1
// }
//
// // 计算改进的部分匹配表（nextval数组）
// void computeNextVal(const char* pattern, int* nextval) {
//     int patternLength = strlen(pattern);
//     nextval[0] = 0; // nextval数组的初始值
//     int k = 0; // k表示前缀的长度
//     for (int i = 1; i < patternLength; i++) {
//         while (k > 0 && pattern[k] != pattern[i]) {
//             k = nextval[k - 1];
//         }
//         if (pattern[k] == pattern[i]) {
//             k++;
//         }
//         if (k > 0 && pattern[i + 1] == pattern[k]) {
//             nextval[i] = nextval[k - 1];
//         } else {
//             nextval[i] = k;
//         }
//     }
// }
//
// // 使用nextval数组的KMP匹配算法
// int KMPWithNextVal(const char* text, const char* pattern) {
//     int textLength = strlen(text);
//     int patternLength = strlen(pattern);
//     int nextval[patternLength];
//     computeNextVal(pattern, nextval);
//
//     int i = 0; // 主字符串的索引
//     int j = 0; // 模式字符串的索引
//     while (i < textLength && j < patternLength) {
//         if (j == 0 || text[i] == pattern[j]) {
//             i++;
//             j++;
//         } else {
//             j = nextval[j - 1];
//         }
//     }
//     if (j == patternLength) {
//         return i - j; // 返回模式字符串在主字符串中的起始位置
//     }
//     return -1; // 如果没有找到匹配的子序列，返回-1
// }
//
// int main() {
//     const char* text = "hello world";
//     const char* pattern = "world";
//
//     // 简单模式匹配（暴力匹配）
//     int position = simpleMatch(text, pattern);
//     if (position != -1) {
//         printf("Simple Match: Pattern found at position: %d\n", position);
//     } else {
//         printf("Simple Match: Pattern not found in the text.\n");
//     }
//
//     // KMP算法
//     position = KMP(text, pattern);
//     if (position != -1) {
//         printf("KMP: Pattern found at position: %d\n", position);
//     } else {
//         printf("KMP: Pattern not found in the text.\n");
//     }
//
//     // 使用nextval数组的KMP算法
//     position = KMPWithNextVal(text, pattern);
//     if (position != -1) {
//         printf("KMP with NextVal: Pattern found at position: %d\n", position);
//     } else {
//         printf("KMP with NextVal: Pattern not found in the text.\n");
//     }
//
//     return 0;
// }